#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct LNode {
    ElemType data;
    LNode *next;
} LNode, *LinkList;

void List_head_insert(LinkList &L) {
    L = (LinkList) malloc(sizeof(LNode));//申请头指针
    ElemType num;
    LinkList q, p;
    q = L;//将头结点的位置赋给头指针
    scanf("%d", &num);
    while (num != 9999) {
        p = (LinkList) malloc(sizeof(LNode));
        p->data = num;
        q->next = p;//将新结点的位置赋给尾结点的next指针
        q = p;//将指针地址赋给下一个指针
        scanf("%d", &num);
    }
    p->next = NULL;//将尾指针的数据域置为NULL
}

LinkList GetElem(LinkList L, ElemType pos) {
    int i = 0;
    if (pos < 0) return NULL;
    while (L && i < pos) {
        L = L->next;
        i++;
    }
    return L;
}

//删除第i个位置的元素
//删除时L头指针是不变的，所以不需要引用
bool ListDelete(LinkList L, ElemType DeletePos) {
    LinkList p = GetElem(L, DeletePos - 1);//拿到要删除结点的前一个结点
    if (p==NULL) {
        return false;
    }
    LinkList q = p->next;//拿到要删除的结点
    p->next = q->next;//断链
    free(q);//资源释放
    return true;

}

//链表输出
void Print_list(LinkList L) {
    L = L->next;
    while (L) {
        printf("%3d", L->data);
        L = L->next;
    }
}

//单链表的删除
int main() {
    LinkList L;
    List_head_insert(L);
    Print_list(L);
    printf("\n");
    bool flag = ListDelete(L, 1);//删除第四个位置的元素
    if (flag) {
        printf("Deleted successfully!\n");
        Print_list(L);
    } else {
        printf("Deletion failure\n");
    }

    return 0;
}
